home *** CD-ROM | disk | FTP | other *** search
-
-
-
- XXXXmmmmRRRReeeessssoooollllvvvveeeePPPPaaaarrrrttttOOOOffffffffsssseeeettttssss((((3333XXXX)))) UUUUNNNNIIIIXXXX SSSSyyyysssstttteeeemmmm VVVV XXXXmmmmRRRReeeessssoooollllvvvveeeePPPPaaaarrrrttttOOOOffffffffsssseeeettttssss((((3333XXXX))))
-
-
-
- NNNNAAAAMMMMEEEE
- _X_m_R_e_s_o_l_v_e_P_a_r_t_O_f_f_s_e_t_s - A function that allows writing of
- upward-compatible applications and widgets
-
- SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
- #include <Xm/XmP.h>
-
- void XmResolvePartOffsets (wwwwiiiiddddggggeeeetttt____ccccllllaaaassssssss,,,, ooooffffffffsssseeeetttt)
- _W_i_d_g_e_t_C_l_a_s_swwwwiiiiddddggggeeeetttt____ccccllllaaaassssssss;
- _X_m_O_f_f_s_e_t_P_t_r**** ooooffffffffsssseeeetttt;
-
- DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
- The use of offset records requires one extra global variable
- per widget class. The variable consists of a pointer to an
- array of offsets into the widget record for each part of the
- widget structure. The _X_m_R_e_s_o_l_v_e_P_a_r_t_O_f_f_s_e_t_s function
- allocates the offset records needed by an application to
- guarantee upward-compatible access to widget instance
- records by applications and widgets. These offset records
- are used by the widget to access all of the widget's
- variables. A widget needs to take the following steps:
-
- +o Instead of creating a resource list, the widget creates
- an offset resource list. To help you accomplish this,
- use the _X_m_P_a_r_t_R_e_s_o_u_r_c_e structure and the _X_m_P_a_r_t_O_f_f_s_e_t
- macro. The _X_m_P_a_r_t_R_e_s_o_u_r_c_e data structure looks just
- like a resource list, but instead of having one integer
- for its offset, it has two shorts. This is put into
- the class record as if it were a normal resource list.
- Instead of using _X_t_O_f_f_s_e_t for the offset, the widget
- uses _X_m_P_a_r_t_O_f_f_s_e_t. XmPartResource resources[] = {
- { BarNxyz, BarCXyz, XmRBoolean,
- sizeof(Boolean), XmPartOffset(Bar,xyz),
- XmRImmediate, (XtPointer)False } };
-
- +o Instead of putting the widget size in the class record,
- the widget puts the widget part size in the same field.
-
- +o Instead of putting _X_t_V_e_r_s_i_o_n in the class record, the
- widget puts _X_t_V_e_r_s_i_o_n_D_o_n_t_C_h_e_c_k in the class record.
-
- +o The widget defines a variable, of type _X_m_O_f_f_s_e_t_P_t_r, to
- point to the offset record. This can be part of the
- widget's class record or a separate global variable.
-
- +o In class initialization, the widget calls
- _X_m_R_e_s_o_l_v_e_P_a_r_t_O_f_f_s_e_t_s, passing it a pointer to contain
- the address of the offset record and the class record.
- This does several things:
-
- Adds the superclass (which, by definition, has already been
- initialized) size field to the part size field
-
-
-
- Page 1 (printed 11/11/03)
-
-
-
-
-
-
- XXXXmmmmRRRReeeessssoooollllvvvveeeePPPPaaaarrrrttttOOOOffffffffsssseeeettttssss((((3333XXXX)))) UUUUNNNNIIIIXXXX SSSSyyyysssstttteeeemmmm VVVV XXXXmmmmRRRReeeessssoooollllvvvveeeePPPPaaaarrrrttttOOOOffffffffsssseeeettttssss((((3333XXXX))))
-
-
-
- Allocates an array based upon the number of superclasses
-
- Fills in the offsets of all the widget parts with the
- appropriate values, determined by examining the size fields
- of all superclass records
-
- Uses the part offset array to modify the offset entries in
- the resource list to be real offsets, in place
-
- +o The widget defines a constant which will be the index
- to its part structure in the offsets array. The value
- should be 1 greater than the index of the widget's
- superclass. Constants defined for all Xm widgets can
- be found in _X_m_P._h. #define BarIndex (XmBulletinBIndex
- + 1)
-
- +o Instead of accessing fields directly, the widget must
- always go through the offset table. The _X_m_F_i_e_l_d macro
- helps you access these fields. Because the
- _X_m_P_a_r_t_O_f_f_s_e_t and _X_m_F_i_e_l_d macros concatenate things
- together, you must ensure that there is no space after
- the part argument. For example, the following macros
- do not work because of the space after the part (Label)
- argument: XmField(w, offset, Label , text, char *)
- XmPartOffset(Label , text) Therefore, you must not have
- any spaces after the part (Label) argument, as
- illustrated here: XmField(w, offset, Label, text, char
- *) You can define macros for each field to make this
- easier. Assume an integer field xxxxyyyyzzzz:
- #define BarXyz(w) (*(int *)(((char *) w) + \
- offset[BarIndex] + XtOffset(BarPart,xyz)))
-
- The parameters for _X_m_R_e_s_o_l_v_e_P_a_r_t_O_f_f_s_e_t_s are defined below:
-
- wwwwiiiiddddggggeeeetttt____ccccllllaaaassssssss
- Specifies the widget class pointer for the created widget.
-
- ooooffffffffsssseeeetttt
- Returns the offset record.
-
- RRRREEEELLLLAAAATTTTEEEEDDDD IIIINNNNFFFFOOOORRRRMMMMAAAATTTTIIIIOOOONNNN
- _X_m_R_e_s_o_l_v_e_A_l_l_P_a_r_t_O_f_f_s_e_t_s(_3_X).
-
-
-
-
-
-
-
-
-
-
-
-
-
- Page 2 (printed 11/11/03)
-
-
-
-